import Validate from "../validate/model";
import {common} from '../common'

class BaseDataModel {

    constructor() {
        this.$idField = 'id';             // 标识列
        this.$dataList = [];             // 接口返回的数组

        this.$props = {};            // 初始属性 该项必须在子类中重新定义
        this.$listMode = 'get';     // 调用set接口时的模式，可选值post、postJson、get，需要跟后台对应起来
        this.$setMode = 'postJson';     // 调用set接口时的模式，可选值post、postJson、get，需要跟后台对应起来
        this.$delMode = 'get';     // 调用delete接口时的模式，可选值post、postJson、get，需要跟后台对应起来

        this.$limit = 20;
        this.id = 0;

        this.$total = 0;
        this.$totalPage = 0;
        this.$end = false;
        this.$nowPage = 1;


        //以下两者分离，是为了避免表单数值改变后，用户没有点搜索的情况
        this.$searchForm = {};        //搜索表单绑定的数据
        this.$searchPara = {};        //实际传递到后台的数据

        this.$rule = {};
    }


    /**
     * 初始化类 将$props中所有属性名称存入$keys，方便调用
     */
    $init() {
        this.$keys = Object.keys(this.$props);
        this.$new();
    }

    $check() {
        return new Validate(this, this.$rule).check(this);
    }

    /**
     * 将所有属性重置为默认值
     */
    $new() {
        Object.assign(this, this.$props);
    }

    /**
     * 应用查询参数
     */
    $search() {
        this.$nowPage = 1;
        this.$end = false;
        Object.assign(this.$searchPara, this.$searchForm);
        const keys = Object.keys(this.$searchPara);
        //自动去除空值
        keys.forEach((key) => {
            if (this.$searchPara[key] === '') {
                this.$searchPara[key] = undefined;
            }
        });
        this.$beforeSearch(this.$searchPara, this.$searchForm);
    }

    /**
     * 重置limit
     * @param limit
     */
    $setLimit(limit) {
        this.$nowPage = 1;
        this.$end = false;
        this.$limit = limit;
    }

    /**
     * $getPage（分页list）加载完成后触发
     * 用于对后端输出的数据作额外处理
     * @param data
     */
    $afterGetList(data) {
        return data;
    }

    /**
     * $getData调用成功后触发
     * 用于对后端输出的数据作额外处理
     * @param data
     */
    $afterGet() {
    }

    /**
     *
     /**
     * 事件 当用户点击搜索（应用搜索条件）时触发
     * 事件内可对$searchPara中的数据进行转换
     * @param result = this.$searchPara
     * @param source = this.$searchForm
     */
    $beforeSearch(result, source) {

    }

    $find(id) {
        return this.$dataList.find((item) => {
            return item[this.$idField] === id;
        })
    }

    $formData() {
        return common.assign({}, this, this.$keys);
    }
}

export {
    BaseDataModel
}

export default BaseDataModel;
